package main

import (
	"context"
	"errors"
	"fmt"
	"time"
)

func main0() {
	// 创建一个父Context
	parentCtx, cancelParent := context.WithCancel(context.Background())

	// 使用WithCancel和WithValue创建一个子Context
	childCtx, cancelChild := context.WithCancel(context.WithValue(parentCtx, "key", "value"))

	// 在一个新的goroutine中运行一个任务，使用子Context
	go func() {
		select {
		case <-childCtx.Done():
			fmt.Println("Child context was canceled")
		case <-parentCtx.Done():
			fmt.Println("Parent context was canceled")
		}
	}()

	// 模拟一些工作
	time.Sleep(1 * time.Second)

	// 取消父Context
	fmt.Println("Canceling parent context")
	cancelParent()

	// 等待子goroutine完成
	time.Sleep(1 * time.Second)

	// 验证子Context的状态
	if !errors.Is(childCtx.Err(), context.Canceled) {
		fmt.Println("Child context was not canceled")
	} else {
		fmt.Println("Child context was canceled, as expected")
	}

	// 取消子Context（虽然这通常是不必要的，因为父Context的取消已经足够）
	cancelChild()
}
